﻿#region

using System;
using System.Linq.Expressions;
using Tateeda.ClinicalStudy.Base.Modules.Rules.Mapping;

#endregion

#region - Legal -

///<legal>
/// Copyright © 2011, Tateeda Media Network
/// All rights reserved. http://tateeda.com
///
/// Redistribution and use in source and binary forms, with or without
/// modification, are permitted provided that the following conditions
/// are met:
///
/// - Redistributions of source code must retain the above copyright
/// notice, this list of conditions and the following disclaimer.
///
/// - Neither the name of the Tateeda Media Network, nor the names of its
/// contributors may be used to endorse or promote products
/// derived from this software without specific prior written
/// permission.
///
/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
/// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
/// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
/// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
/// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
/// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES INCLUDING,
/// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
/// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
/// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
/// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
/// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
/// POSSIBILITY OF SUCH DAMAGE.
///</legal>

#endregion - Legal -

namespace Tateeda.ClinicalStudy.Base.Modules.Rules.Flowchart {

    public static class FluentFlowchartExtensions {

        public static Flowchart<T, R> WithShape<T, R>(this Flowchart<T, R> chart, string shapeName) {
            Shape<T, R> shape = new Shape<T, R> { Name = shapeName };
            chart.Shapes.Add(shape);
            return chart;
        }

        public static Flowchart<T, R> YieldingResult<T, R>(this Flowchart<T, R> chart, R result) {
            chart.LastShape().Result = result;
            return chart;
        }

        public static Flowchart<T, R> RequiresField<T, R>(this Flowchart<T, R> chart, Expression<Func<T, object>> field) {
            PropertySpecifier<T> specifier = new PropertySpecifier<T>(field);
            chart.LastShape().RequiredField = specifier;
            return chart;
        }

        public static Flowchart<T, R> WithArrowPointingTo<T, R>(this Flowchart<T, R> chart, string pointsTo) {
            Arrow<T> arrow = new Arrow<T>();
            arrow.PointsTo = pointsTo;
            chart.LastShape().Arrows.Add(arrow);
            return chart;
        }

        public static Flowchart<T, R> AndTheRule<T, R>(this Flowchart<T, R> chart, Func<T, bool> rule) {
            chart.LastShape().LastArrow().Rule = rule;
            return chart;
        }

        public static Flowchart<T, R> AndTheAction<T, R>(this Flowchart<T, R> chart, Action<T> action) {
            chart.LastShape().LastArrow().Action = action;
            return chart;
        }

        public static Shape<T, R> LastShape<T, R>(this Flowchart<T, R> chart) {
            return chart.Shapes[chart.Shapes.Count - 1];
        }

        public static Arrow<T> LastArrow<T, R>(this Shape<T, R> shape) {
            return shape.Arrows[shape.Arrows.Count - 1];
        }
    }
}